#include <iostream>
#include <unistd.h>
#include <thread>
#include <string>
// // int val = 100;
// #define NUM 10
// int* addr = nullptr;

__thread int gval = 100;
    
std::string toHex(pthread_t pid)
{
    char buffer[64];
    snprintf(buffer, sizeof(buffer), "0x%lx", pid);
    return buffer;
}

void* run(void* args){

    std::string name = static_cast<const char*>(args);
    while(true){
        std::cout << "I am " << name << ", thread , gval: " << gval<<" , &gval: " << &gval  << std::endl;
        gval++;
        sleep(1);
    }
}
int main(){
    pthread_t pid;
    pthread_create(&pid,nullptr,run,(void*)"thread-1");

    while(true){
        std::cout << "I am main thread gval : " << gval << " &gval: " << &gval << std::endl;
        sleep(1);
    }  
    pthread_join(pid,nullptr);

    return 0;
}
// void* run(void* args){
//     sleep(5);
//     pthread_detach(pthread_self());
//     sleep(3);
//     std::string name = static_cast<const char*>(args);
//     while(true){
//         std::cout << "I am " << name << ", thread id is : " << toHex(pthread_self())  << std::endl;
//         sleep(1);
//         // pthread_exit((void*)10);
//     }
// }
// int main(){
//     pthread_t pid;
//     pthread_create(&pid,nullptr,run,(void*)"thread-1");
//     std::cout << "I am main thread, id is : " << toHex(pthread_self())  << std::endl;
//     sleep(2);
//     void* ret = nullptr;
//     int n = pthread_join(pid,&ret);
//     if (n != 0){
//         std::cout << "等待失败" << " n: "  << n << std::endl;
//         return 1;
//     }
//     else {
//         std::cout << "等待成功, ret: " << (long long)(ret) << std::endl;
//     }
//     while(true){
//         std::cout << "I am main thread id is : " << toHex(pthread_self())  << std::endl;
//         sleep(1);
//     }    
//     return 0;
// }


// void* run(void* args){
//     std::string name = static_cast<const char*>(args);
//     while(true){
//         std::cout << "I am " << name << ", thread id is : " << toHex(pthread_self())  << std::endl;
//         sleep(1);
//         pthread_exit((void*)10);
//     }
// }
// int main(){
//     pthread_t pid;
//     pthread_create(&pid,nullptr,run,(void*)"thread-1");
//     std::cout << "I am main thread, id is : " << toHex(pthread_self())  << std::endl;

//     void* ret = nullptr;
//     int n = pthread_join(pid,&ret);
//     if (n != 0){
//         std::cout << "等待失败" << " n: "  << n << std::endl;
//         return 1;
//     }
//     std::cout << "等待成功, ret: " << (long long)(ret) << std::endl;
//     return 0;
// }

// void* run(void* args){
//     std::string name = static_cast<const char*>(args);
//     while(true){
//         std::cout << "I am " << name << ", thread id is : " << toHex(pthread_self())  << std::endl;
//         sleep(1);
//     }
// }
// int main(){
//     pthread_t pid;
//     pthread_create(&pid,nullptr,run,(void*)"thread-1");
//     std::cout << "I am main thread, id is : " << toHex(pthread_self())  << std::endl;
//     // sleep(2);

//     pthread_cancel(pthread_self()); //如果我把主线程取消了呢?
//     while(true){
//         std::cout << "I am main thread,  id is : " << toHex(pthread_self())  << std::endl;
//         sleep(1);
//     }
//     int n = pthread_join(pid,nullptr);
//     if (n != 0){
//         std::cout << "等待失败" << " n: "  << n << std::endl;
//         return 1;
//     }
//     std::cout << "等待成功" << std::endl;
//     return 0;
// }

// void *run(void *args)
// {
//     int a = 10;
//     addr = &a;
//     std::cout << "I am new thread, val of a : " << a << std::endl;
//     sleep(5);
//     return nullptr;
// }

// int main()
// {
//     pthread_t pid;
//     pthread_create(&pid, nullptr, run, nullptr);
//     sleep(2);
//     std::cout << "I am main thread, val of a : " << *addr << std::endl;

//     pthread_join(pid,nullptr);
//     return 0;
// }

// class ThreadData
// {
// public:
//     ThreadData() {}
//     ~ThreadData() {}
//     void Init(const std::string &name, int a, int b)
//     {
//         _name = name;
//         _a = a;
//         _b = b;
//     }
//     std::string Name() { return _name; }
//     void Excute() { _result = _a + _b; }
//     int Result() { return _result; }
//     int A() { return _a; }
//     int B() { return _b; }

// private:
//     std::string _name;
//     int _a;
//     int _b;
//     int _result;
// };

// std::string toHex(pthread_t pid)
// {
//     char buffer[64];
//     snprintf(buffer, sizeof(buffer), "0x%lx", pid);
//     return buffer;
// }

// void *run(void *args)
// {
//     ThreadData *d = static_cast<ThreadData *>(args);
//     std::cout << "I am " << d->Name() << std::endl;
//     d->Excute();
//     return (void *)d;
// }
// int main()
// {
//     pthread_t pid;
//     ThreadData data;
//     data.Init("线程1",10,20);
//     pthread_create(&pid, nullptr, run, (void *)(&data));

//     std::cout << "I am main thread " << std::endl;

//     void *ret;
//     int n = pthread_join(pid, &ret);
//     std::cout << ((ThreadData *)ret)->Result() << std::endl;

//     return 0;
// }

// void *run(void *args)
// {
//     ThreadData* d = static_cast<ThreadData *>(args);
//     std::cout << "I am " << d->Name() <<  std::endl;
//     d->Excute();
//     return nullptr;
// }
// int main()
// {
//     pthread_t pid[NUM];
//     ThreadData data[NUM];
//     for (int i = 0; i < NUM; i++)
//     {
//         char buffer[32];
//         snprintf(buffer,sizeof(buffer),"thread[%d]",i);
//         data[i].Init(buffer,i*10,i*20);
//         pthread_create(&pid[i], nullptr, run, (void *)(&data[i]));
//     }

//     std::cout << "I am main thread " << std::endl;

//     for (int i = 0; i < NUM; i++)
//     {
//         int n = pthread_join(pid[i], nullptr);
//         if (n != 0)
//         {
//             std::cout << "等待线程失败" << std::endl;
//             return 1;
//         }
//         std::cout << "等待线程成功, 线程name: " << data[i].Name() << std::endl;
//     }

//     for (int i = 0; i < NUM; i++){
//         std::cout << data[i].Name() << " 运行 [" << data[i].A() << "] + " << "[" << data[i].B() << "]= " << data[i].Result() << std::endl;
//     }

//     return 0;
// }

// // void* run(void* args){
//     std::string name = static_cast<const char*>(args);
//     while(true){
//         std::cout << "I am " << name << ", thread id is : " << toHex(pthread_self()) << " val(修改): " << val  << std::endl;
//         ++val;
//         sleep(1);
//         // int* p = nullptr;
//         // *p = 10;
//     }
// }
// int main(){
//     pthread_t pid;
//     pthread_create(&pid,nullptr,run,(void*)"thread-1");

//     while(true){
//         std::cout << "I am main thread, id is : " << toHex(pthread_self()) << " val(打印) " << val << std::endl;
//         sleep(1);
//     }
//     return 0;
// }
// int main(){
//     // pthread_t pid;
//     // pthread_create(&pid,nullptr,run,(void*)"thread-1");
//     // std::thread t([](){
//     //     while(true){
//     //         std::cout << "I am new thread, pid is : " << getpid() << std::endl;
//     //         sleep(1);
//     //     }
//     // });

//     while(true){
//         std::cout << "I am main thread, pid is : " << getpid() << std::endl;
//         sleep(1);
//     }
//     return 0;
// }